﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using Entidades;

namespace AccesoBD
{
    public class FechasImportante
    {
        public static bool registrarFecha(FechaImportante fecha)
        {
            bool res = false;
            SqlConnection conexion = DB.Conectar();
            try
            {
                string comando = "INSERT INTO Fecha_Importante (fecha, motivo, noLaborable) VALUES (@fecha,@motivo,@noLab)";
                SqlCommand sqlcmd = new SqlCommand(comando, conexion);
                sqlcmd.Parameters.Add(new SqlParameter("@fecha", fecha.Fecha));
                sqlcmd.Parameters.Add(new SqlParameter("@motivo", fecha.Motivo));
                sqlcmd.Parameters.Add(new SqlParameter("@noLab", fecha.NoLaborable));
                int filas = sqlcmd.ExecuteNonQuery();

                if (filas > 0)
                    res = true;
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                conexion.Close();
            }
            return res;
        }

        public static bool registrarFecha(List<FechaImportante> listaFechas)
        {
            bool res = true;
            SqlConnection conexion = DB.Conectar();
            SqlTransaction trans = null;
            try
            {
                trans = conexion.BeginTransaction();

                string comando = "INSERT INTO Fecha_Importante (fecha, motivo, noLaborable) VALUES (@fecha,@motivo,@noLab)";
                int filas = 0;
                for (int i = 0; i < listaFechas.Count; i++)
                {
                    SqlCommand sqlcmd = new SqlCommand(comando, conexion);
                    sqlcmd.Parameters.Add(new SqlParameter("@fecha", listaFechas[i].Fecha));
                    sqlcmd.Parameters.Add(new SqlParameter("@motivo", listaFechas[i].Motivo));
                    sqlcmd.Parameters.Add(new SqlParameter("@noLab", listaFechas[i].NoLaborable));
                    sqlcmd.Transaction = trans;
                    filas = sqlcmd.ExecuteNonQuery();
                }

                if (filas > 0)
                {
                    trans.Commit();
                    res = true;
                }
            }
            catch (Exception)
            {
                trans.Rollback();
                throw;
            }
            finally
            {
                conexion.Close();
            }
            return res;
        }


        //este registra y elimina las fechas que deban eliminarse
        public static bool registrarFecha2(List<FechaImportante> listaFechas)
        {
            bool res = true;
            SqlConnection conexion = DB.Conectar();
            SqlTransaction trans = null;
            try
            {
                trans = conexion.BeginTransaction();

                string comando;
                int filas = 0;
                for (int i = 0; i < listaFechas.Count; i++)
                {
                    SqlCommand sqlcmd = null;
                    if (listaFechas[i].EstaEnBD == true && listaFechas[i].EsEliminada)
                    {
                        comando = "DELETE FROM Fecha_Importante WHERE (fecha = @fecha)";
                        sqlcmd = new SqlCommand(comando, conexion);
                        sqlcmd.Parameters.Add(new SqlParameter("@fecha", listaFechas[i].Fecha));
                    }
                    else
                    {
                        if (listaFechas[i].EstaEnBD == false)
                        {
                            comando = "INSERT INTO Fecha_Importante (fecha, motivo, noLaborable) VALUES (@fecha,@motivo,@noLab)";
                            sqlcmd = new SqlCommand(comando, conexion);
                            sqlcmd.Parameters.Add(new SqlParameter("@fecha", listaFechas[i].Fecha));
                            sqlcmd.Parameters.Add(new SqlParameter("@motivo", listaFechas[i].Motivo));
                            sqlcmd.Parameters.Add(new SqlParameter("@noLab", listaFechas[i].NoLaborable));
                        }
                        
                    }
                    if (sqlcmd != null)
                    {
                        sqlcmd.Transaction = trans;
                        filas = sqlcmd.ExecuteNonQuery();
                    }
                    
                }

                if (filas > 0)
                {
                    trans.Commit();
                    res = true;
                }
            }
            catch (Exception)
            {
                trans.Rollback();
                throw;
            }
            finally
            {
                conexion.Close();
            }
            return res;
        }

        //trae todas las fechas, pero solo del año actual
        public static List<FechaImportante> obtenerFechas()
        {
            List<FechaImportante> list = null;
            SqlConnection conexion = DB.Conectar();
            try
            {
                string comando = "SELECT fecha, motivo FROM Fecha_Importante WHERE YEAR(fecha) = YEAR(getdate())";
                SqlCommand sqlcmd = new SqlCommand(comando, conexion);
                SqlDataReader dr = sqlcmd.ExecuteReader();

                list = new List<FechaImportante>();
                FechaImportante fechaImp = null;
                while (dr.Read())
                {
                    fechaImp = new FechaImportante();
                    fechaImp.Fecha = DateTime.Parse(dr["fecha"].ToString());
                    fechaImp.Motivo = dr["motivo"].ToString();
                    fechaImp.EsEliminada = false;
                    fechaImp.EstaEnBD = true;

                    list.Add(fechaImp);
                    fechaImp = null;
                }
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                conexion.Close();
            }
            return list;
        }
    }
}
